package com.jcai.middlend.codegenerator.processor;// package com.jcai.middlend.feignapi.infrastructure.annotation;
//
// import com.google.auto.service.AutoService;
// import com.jcai.middlend.feignapi.infrastructure.dataconversion.AbstractByteEnumConverter;
// import com.squareup.javapoet.ClassName;
// import com.squareup.javapoet.JavaFile;
// import com.squareup.javapoet.ParameterizedTypeName;
// import com.squareup.javapoet.TypeSpec;
// import com.sun.tools.javac.api.JavacTrees;
// import com.sun.tools.javac.code.Flags;
// import com.sun.tools.javac.processing.JavacProcessingEnvironment;
// import com.sun.tools.javac.tree.JCTree;
// import com.sun.tools.javac.tree.TreeMaker;
// import com.sun.tools.javac.util.*;
//
// import javax.annotation.processing.*;
// import javax.lang.model.SourceVersion;
// import javax.lang.model.element.Element;
// import javax.lang.model.element.Modifier;
// import javax.lang.model.element.PackageElement;
// import javax.lang.model.element.TypeElement;
// import javax.lang.model.util.Elements;
// import javax.persistence.Convert;
// import java.io.IOException;
// import java.util.Collections;
// import java.util.Set;
//
// /**
//  * @author: zhuCan
//  * @date: 2019/10/17 13:56
//  * @description:
//  */
// @AutoService(Processor.class)
// public class EnumConvertProcessor extends AbstractProcessor {
//
//
//   private Filer filer;
//   private Messager messager;
//   private Elements elementUtils;
//   private JavacTrees trees;
//   private TreeMaker treeMaker;
//   private Names names;
//
//
//   @Override
//   public synchronized void init(ProcessingEnvironment processingEnvironment) {
//     super.init(processingEnvironment);
//     filer = processingEnv.getFiler();
//     messager = processingEnvironment.getMessager();
//     elementUtils = processingEnvironment.getElementUtils();
//     trees = JavacTrees.instance(processingEnvironment);
//     Context context = ((JavacProcessingEnvironment) processingEnvironment).getContext();
//     treeMaker = TreeMaker.instance(context);
//     names = Names.instance(context);
//   }
//
//   @Override
//   public Set<String> getSupportedAnnotationTypes() {
//     return Collections.singleton(EnumConverter.class.getCanonicalName());
//   }
//
//   @Override
//   public SourceVersion getSupportedSourceVersion() {
//     return SourceVersion.latestSupported();
//   }
//
//   @Override
//   public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
//     System.err.println("Processor : " + getClass().getSimpleName());
//     long start = System.currentTimeMillis();
//
//     Set<? extends Element> elements = roundEnvironment.getElementsAnnotatedWith(EnumConverter.class);
//
//     elements.forEach(x -> {
//       PackageElement packageElement = elementUtils.getPackageOf(x);
//       String packageName = packageElement.getQualifiedName().toString();
//       // 被扫描的类名
//       javax.lang.model.element.Name simpleName = x.getSimpleName();
//
//       // 构建类
//       TypeSpec clazz = null;
//       try {
//         clazz = TypeSpec.classBuilder(x.getSimpleName() + "Converter")
//             .addModifiers(Modifier.PUBLIC, Modifier.FINAL)
//             .addAnnotation(Convert.class)
//             .addJavadoc(" generator for enum converter " + doc)
//             .superclass(ParameterizedTypeName.get(ClassName.get(AbstractByteEnumConverter.class),
//                 ClassName.get(Class.forName(packageName + "." + simpleName)),
//                 ClassName.get(Integer.class)))
//             .build();
//       } catch (ClassNotFoundException e) {
//         e.printStackTrace();
//       }
//       try {
//         // 创建java文件
//         JavaFile javaFile = JavaFile.builder(packageName, clazz)
//             .build();
//         // 写入
//         javaFile.writeTo(filer);
//       } catch (IOException e) {
//         e.printStackTrace();
//       }
//
//     });
//     System.out.println("耗时 : " + (System.currentTimeMillis() - start) + " 毫秒");
//     return true;
//   }
//
//
//   private JCTree.JCMethodDecl makeGetterMethodDecl(JCTree.JCVariableDecl jcVariableDecl) {
//
//     ListBuffer<JCTree.JCStatement> statements = new ListBuffer<>();
//     statements.append(treeMaker.Return(treeMaker.Select(treeMaker.Ident(names.fromString("this")), jcVariableDecl.getName())));
//     JCTree.JCBlock body = treeMaker.Block(0, statements.toList());
//     return treeMaker.MethodDef(treeMaker.Modifiers(Flags.PUBLIC), getNewMethodName(jcVariableDecl.getName()), jcVariableDecl.vartype, List.nil(), List.nil(), List.nil(), body, null);
//   }
//
//   private Name getNewMethodName(Name name) {
//     String s = name.toString();
//     return names.fromString("get" + s.substring(0, 1).toUpperCase() + s.substring(1, name.length()));
//   }
//
// }
